#include <iostream>
#include <string>
// 因为需要的是jsoncpp下的json下的json.h头文件，所以需要把前导路径带上
#include <jsoncpp/json/json.h>
#include <sstream>

void x()
{
    // 1. 序列化
    //  万能对象
    Json::Value root;
    // 不用关注类型
    root["name"] = "张三";
    root["sex"] = "男";
    root["age"] = "18";

    // Json::FastWriter writer; //去掉了换行符，网络传送的数据量就小了
    // 风格式的写入，用\n给我们按行进行设置了，可读性好
    // Json::StyledWriter writer;
    // std::string s = writer.write(root);
    // std::cout << s << std::endl;

    // 关于中文被转换为了unicode编码的解决方式
    Json::StreamWriterBuilder jswBuilder; // StreamWriter的工厂
    jswBuilder["emitUTF8"] = true;
    std::unique_ptr<Json::StreamWriter> writer(jswBuilder.newStreamWriter());
    std::stringstream ss;
    writer->write(root, &ss);
    std::cout << ss.str() << std::endl;

    // 还可以定义子json
    // Json::Value sub;
    // sub["籍贯"] = "xxx";
    // sub["tel"] = "12345";

    // root["info"] = sub;

    // // 调用json对象内部方法转换成字符串
    // std::string s = root.toStyledString();
    // std::cout << s << std::endl;
}

int main()
{
    // 反序列化
    std::string json_string = "{\"name\":\"张三\",\"age\":30, \"city\":\"北京\"}";

    // 反序列化，起手式Json::Value;
    Json::Value root;
    Json::Reader reader; // 序列化时是Writer，那么反序列化时用的就是Reader，类似写读
    // 把json_String反序列化到root中去
    bool ok = reader.parse(json_string, root);
    if (!ok) // 解析失败，反序列化失败
    {
        std::cout << reader.getFormattedErrorMessages() << std::endl;
        return 1;
    }

    // 反序列化成功
    // （把序列化之后的字符串反序列化到了Json::Value中，和序列化相反）
    // 通过键值k来提取v，也就是对应的信息
    // 然后把v转化成对应信息类型就能拿我们的对应信息类型变量接收啦
    std::string name = root["name"].asString();
    int age = root["age"].asInt();
    std::string city = root["city"].asString();

    std::cout << name << std::endl;
    std::cout << age << std::endl;
    std::cout << city << std::endl;
}